#ifndef VENTANAPRINCIPAL_H_
#define VENTANAPRINCIPAL_H_
#include <gtkmm-2.4/gtkmm.h>
#include "../../ConfiguracionServidor/Src/Configuracion.h"
#include "../../ConfiguracionServidor/Src/TipoEstatico.h"
#include "../../Cliente/Src/ClienteControl.h"

#define PATH_SERVIDOR "./Servidor/appTest"

class VentanaPrincipal {
private:
	ClienteControl clienteControl;

	bool solapasVisibles;
	/* Builder */
	Glib::RefPtr<Gtk::Builder> builder;
	Gtk::Window *ventanaPpal;

	/* Dialogos */
	Gtk::Dialog* dialogEstatico;
	Gtk::Dialog* dialogDinamico;
	Gtk::Dialog* dialogUsuario;
	Gtk::Dialog* dialogError;
	void inicializarDialogos();
	void on_click_btnExaminar();
	void on_click_btnExaminarRaiz();

	void on_click_btnExaminarLogAccesos();
	void on_click_btnExaminarLogErrores();

	/* Barra de menu */
	Gtk::Widget* menu;
	Glib::RefPtr<Gtk::UIManager> menu_UIManager;
	Glib::RefPtr<Gtk::ActionGroup> menuArchivo;
	Glib::RefPtr<Gtk::ActionGroup> menuConfiguracion;
	Glib::RefPtr<Gtk::ActionGroup> menuControl;
	Glib::RefPtr<Gtk::ActionGroup> menuReportes;
	Glib::RefPtr<Gtk::ActionGroup> menuAyuda;

	/* Abrir configuracion */
	void cargarConfiguracion(const std::string &path);
	void setConfiguracionBasica(const ConfiguracionBasica& confBasica);
	void setConfiguracionEstatico(std::list<TipoEstatico> configuracion);
	void setConfiguracionDinamico(std::list<TipoDinamico> configuracion);
	void setConfiguracionUsuario(std::list<Usuario> configuracion);
	void setConfiguracionErrores(std::list<TipoError> configuracion);
	void setConfiguracionReportes(ConfiguracionLogs configuracion);

	/* Guardar configuracion */
	void guardarConfiguracion(const std::string &filename);
	void agregarConfiguracionBasica(Configuracion& configuracion);
	void agregarConfiguracionEstatico(Configuracion& configuracion);
	void agregarConfiguracionDinamico(Configuracion& configuracion);
	void agregarConfiguracionUsuario(Configuracion& configuracion);
	void agregarConfiguracionErrores(Configuracion& configuracion);
	void agregarConfiguracionReportes(Configuracion& configuracion);

	/* */
	void agregarTipoEstatico(const std::string &extension,
			const std::string &contenido);
	void agregarTipoDinamico(const std::string &extension,
			const std::string &comando);
	void agregarUsuario(const std::string &nombre, const std::string &clave);
	void agregarError(const std::string &nroError, const std::string &path);

	/**/
	void on_click_btnAgregarUsuario();
	void on_click_btnModifUsuario();
	void on_click_btnEliminarUsuario();

	void on_click_btnAgregarError();
	void on_click_btnModifError();
	void on_click_btnEliminarError();

	void on_click_btnAgregarDinamico();
	void on_click_btnModifDinamico();
	void on_click_btnEliminarDinamico();

	void on_click_btnAgregarEstatico();
	void on_click_btnModifEstatico();
	void on_click_btnEliminarEstatico();

	/* Eventos barra de menu. */
	void on_click_CargarConfiguracion();
	void on_click_GuardarConfiguracion();
	void on_click_Salir();
	void on_click_ConfiguracionBasica();
	void on_click_ConfiguracionTiposEstaticos();
	void on_click_ConfiguracionTiposDinamicos();
	void on_click_ConfiguracionErrores();
	void on_click_ConfiguracionUsuarios();
	void on_click_VerReportesErrores();
	void on_click_VerReportesAccesos();
	void on_click_ConfiguracionReportes();

	void on_click_VerAcercaDe();
	void on_click_VerAyuda();
	void on_click_IniciarServidor();
	void on_click_ReiniciarServidor();
	void on_click_DetenerServidor();

	/* Mostrar o ocultar las solapas */
	void on_click_CambiarVistaSolapas();

	/* widget de la barra de herramienta */
	Gtk::ToolButton * toolbtDesconectar;

	/* widget del log */
	Gtk::TextView* txtLog;

	/* widget del menu solapas*/
	Gtk::Notebook* ntbOpciones;

	/* widget barra de estado */
	Gtk::Statusbar *barraEstado;

	/* Manejo del chat*/
	Gtk::Entry *txtChatEnviar;
	Gtk::Button *btChatEnviar;

	/* Varios */
	Gtk::Dialog* dialogFecha;
	Gtk::Entry* txtFechaInicioClase;
	Gtk::Calendar* calendario;

	void conectarEventos();

	/* Inicializaciones */
	void cargarBarraDeMenu();
	void cargarWidget();
	void cargarBarraDeHerramientas();

public:
	void IngresarTextoALog(std::string texto);

	VentanaPrincipal();
	virtual ~VentanaPrincipal();
	void init(int argc, char *argv[]);
};

#endif
